
#include <stdio.h>

#include <glib.h>

// GFunc func -> typedef void (*GFunc)(gpointer, gpointer)
void slist_iter_printf(gpointer data, gpointer user_data) {
    printf("%s %s\n", (char*)user_data, (char*)data);
}

int	main(int argc, char **argv)
{
    printf("Hello World\n");

    GSList *list = NULL;

    // 追加元素
    list = g_slist_append(list, "This");
    list = g_slist_append(list, "is");
    list = g_slist_append(list, "Glib");
    list = g_slist_append(list, "SList");
    list = g_slist_append(list, "example");
    list = g_slist_append(list, "!");

    // 打印长度
    printf("slist 长度为: %d\n", g_slist_length(list));

    // 打印某个下标元素 - 通过找节点
    printf("slist 第%d个元素为: %s\n", 0, (char*)g_slist_nth(list, 0)->data);
    // 打印某个下标元素 - 通过找元素
    printf("slist 第%d个元素为: %s\n", 4, (char*)g_slist_nth_data(list, 4));

    // 准备遍历
    g_slist_foreach(list, slist_iter_printf, "->");


    // 遍历 free 掉所有元素 - 如果添加的元素是基于内存申请的话
    // g_slist_foreach(list, free, NULL);

    // 销毁链表 - 只释放链表本身，本示例中添加的元素均是常量，无需释放
    g_slist_free(list);

    return 0;
}
